/*
 * author: Andriamananony, Meß, Falk
 */

package auftrag;

import java.util.ArrayList;

public class Produkt {
	private ArrayList<Variante> arrVariante = new ArrayList<Variante>();
	private Variante mChosenVariant = null;
	private String strProduktName;
	private Auftrag auftrParent;

	public Produkt(Auftrag a, String strProduktName) {
		this.strProduktName = strProduktName;
		this.auftrParent = a;
		a.addProdukt(this);
	}
	
	public int getEndDate(){
		if(mChosenVariant != null)
			return mChosenVariant.getEndDate();
		return -1;
	}

	public void addVarianteToProdukt(Variante varVariante) {
		this.arrVariante.add(varVariante);
	}

	public ArrayList<Variante> getProduktVariante() {
		return this.arrVariante;
	}
	
	public Auftrag getParent(){
		return auftrParent;
	}
	
	@Override
	public String toString(){
		return strProduktName;
	}
	
	public Variante getChosenVariante(){
		return mChosenVariant;
	}
	
	@Override
	public boolean equals(Object o){
		if(Produkt.class.isInstance(o)){
			Produkt p = (Produkt)o;
			if(p.toString().equals(this.toString()) && p.getParent().equals(this.getParent()))
				return true;
		}
		return false;
	}
	
	public void chooseVariant(int i, int pMethod){
		Variante chosenV = arrVariante.get(0);
		if(pMethod == 0){
			if(i > 0)
				i = i % arrVariante.size();
			else
				i = (-i)  % arrVariante.size();
		
			chosenV = arrVariante.get(i);
		}
		else if(pMethod == 1) {
			int min = Integer.MAX_VALUE;
			for(Variante v : arrVariante){
				int current = 0;
				for(Operation o : v.getOperations())
					current += o.getDuration();
				if(current < min){
					min = current;
					chosenV = v;
				}
			}
		}
		else {
			double min = Double.MAX_VALUE;
			for(Variante v : arrVariante){
				double current = 0;
				for(Operation o : v.getOperations()){
					current += o.getRessource().getMaxTime() + o.getDuration();
				}
				current = current / v.numOperations();
				if(current < min){
					min = current;
					chosenV = v;
				}
			}
		}
		mChosenVariant = chosenV;
	}
	
	public int getStartDate(){
		return mChosenVariant.getOperation(1).getInterval().getEnd() - mChosenVariant.getOperation(1).getInterval().getDuration();
	}
	
	public void clearChooseVariant() {
		this.mChosenVariant = null;
	}
}
